home *** CD-ROM | disk | FTP | other *** search
/ NT Sources / Infomagic - NT Source Volume 1 (Disc 1 of 2).iso / network / pcdctrla.exe / PCDCTRL.EXE / PCDSYS.TPU < prev    next >
Text File  |  1997-04-10  |  10KB  |  243 lines

  1. !+++
  2. ! PCDUO_SYSTEM_INI.TPU - Edit the Windows SYSTEM.INI file for PC-Duo
  3. !
  4. ! v3.60 10-Apr-97 JD  - Updated for v3.60
  5. !---
  6.  
  7. ! We have to edit 2 sections: [boot], to change the display.drv= line over to
  8. ! use the PC-Duo intercept driver (PCDVGA.DRV) and to load the Windows Client;
  9. ! and [386Enh] to load the PC-Duo Virtual Device Driver (PCDVXD.386).
  10. ! We also check and may increase NetHeapSize (if it is less than 16).
  11.  
  12. PROCEDURE PCD_update_system ();
  13.  
  14.     ! Declare some local variables - initialised to zero
  15.  
  16.     LOCAL   PCD_display_drv,        ! The current display.drv contents
  17.             PCD_display_pcd,        ! display.pcd= line, if present
  18.             PCD_display_old,        ! display.old= line, if present
  19.             PCD_display_position,   ! The position of PCDVGA in display,drv
  20.             PCD_old_netheapsize,    ! The current NetHeapSize value (string)
  21.             PCD_new_netheapsize,    ! The new NetHeapSize value (integer)
  22.             PCD_section_range,      ! Used to detect or map file sections
  23.             PCD_wclient_line,       ! Used to detect a wclient= line
  24.             PCD_wfw_enablesharing;  ! The WFW EnableSharing= value (string)
  25.  
  26.     ! Create a range to map on to the [boot] section
  27.  
  28.     PCD_section_range := LUT_create_range (LINE_BEGIN + "[boot]", LINE_BEGIN + "[");
  29.  
  30.     ! Pick up the current display driver value(s) to see if the line(s) exist.
  31.     ! Use the LUT_start_line_opt_whitespace pattern so we get the right values
  32.     ! This allows leading whitespace, but nothing else before the keyword.
  33.  
  34.     PCD_display_pcd     := LUT_win_get_value ("[boot]", (LUT_start_line_opt_whitespace + "display.pcd"), PCD_section_range);
  35.     PCD_display_old     := LUT_win_get_value ("[boot]", (LUT_start_line_opt_whitespace + "display.old"), PCD_section_range);
  36.     PCD_wclient_line    := LUT_win_get_value ("[boot]", (LUT_start_line_opt_whitespace + "wclient")    , PCD_section_range);
  37.  
  38.     ! LUT_win_get_value positions the cursor at the beginning of the search
  39.     ! pattern. After the next get_value, it should be at the beginning of the
  40.     ! display.drv line. If there isn't one present, then the file format is
  41.     ! not valid.
  42.  
  43.     PCD_display_drv     := LUT_win_get_value ("[boot]", (LUT_start_line_opt_whitespace + "display.drv"), PCD_section_range);
  44.  
  45.     ! Check the return value. If this is zero, the file is invalid.
  46.  
  47.     If PCD_display_drv <> 0
  48.     Then
  49.         MESSAGE (FAO ("The current display driver is <!AS>", PCD_display_drv));
  50.  
  51.         ! Convert it to UPPER CASE for safer checking
  52.  
  53.         EDIT (PCD_display_drv, UPPER);
  54.  
  55.         ! See whether we are already using the PC-Duo display driver
  56.  
  57.         PCD_display_position := INDEX (PCD_display_drv, "PCDVGA.DRV");
  58.  
  59.         If (PCD_display_position = 0)
  60.         Then
  61.             MESSAGE ("Installing the PC-Duo Display Driver.");
  62.  
  63.             If (PCD_display_pcd <> 0)
  64.             Then
  65.                 ! There is already a display.pcd line present, update it.
  66.  
  67.                 LUT_text_replace ((LINE_BEGIN + MATCH ("display.pcd") + REMAIN),
  68.                     "display.pcd=pcdvga.drv", PCD_section_range);
  69.             Else
  70.                 ! Take advantage of the cursor position being at the beginning
  71.                 ! of the display.drv line. Open up a new line, add a comment
  72.                 ! and then add the display.pcd line
  73.  
  74.                 SPLIT_LINE;
  75.                 MOVE_VERTICAL (-1);
  76.                 COPY_TEXT ("; PCD Display Driver");
  77.                 SPLIT_LINE;
  78.                 COPY_TEXT ("display.pcd=pcdvga.drv");
  79.             Endif;
  80.  
  81.             ! Next, update the display.drv line (which must be present).
  82.             ! This positions the cursor at the end of the display.drv line
  83.  
  84.             LUT_text_replace ((LINE_BEGIN + MATCH ("display.drv") + REMAIN),
  85.                 "display.drv=pcdvga.drv", PCD_section_range);
  86.  
  87.             ! Next, update or add a display.old line
  88.  
  89.             If PCD_display_old <> 0
  90.             Then
  91.                 ! There is already a display.old line present, update it.
  92.  
  93.                 LUT_text_replace ((LINE_BEGIN + MATCH ("display.old=") + REMAIN),
  94.                     "display.old=" + PCD_display_drv, PCD_section_range);
  95.             Else
  96.                 ! Open up a new line and add a display.old line
  97.  
  98.                 SPLIT_LINE;
  99.                 COPY_TEXT ("display.old=" + PCD_display_drv);
  100.             Endif;
  101.         Else
  102.             MESSAGE ("The PC-Duo Display Driver is already installed. Updating.");
  103.  
  104.             LUT_text_replace ((LINE_BEGIN + MATCH ("display.drv=") + REMAIN),
  105.                 "display.drv=pcdvga.drv", PCD_section_range);
  106.         Endif;
  107.  
  108.         ! Lastly, check whether there is already a wclient= line. If so,
  109.         ! update it, otherwise insert a new one. Here, we assume that we are
  110.         ! going to load a Client using the NetBIOS DLL and the * Client Name.
  111.  
  112.         ! We could read the network= line from [386Enh] to see whether it
  113.         ! contains "vnetbios" (NetBIOS) or "vipx" (IPX). However, WFW 3.11
  114.         ! May have vnetbios in network= if it is configured for NWLINK.
  115.         ! Similarly, we could look for signs of TCP/IP Windows Sockets.
  116.  
  117.         ! /uip = IPX, /unb = NetBIOS, /utc = TCP/IP Windows Sockets
  118.  
  119.         If PCD_wclient_line <> 0
  120.         Then
  121.             ! There is already a wclient line present, update it.
  122.  
  123.             MESSAGE ("The PC-Duo Windows Client is already installed. Updating.");
  124.  
  125.             LUT_text_replace ((LINE_BEGIN + MATCH ("wclient=") + REMAIN),
  126.                 "wclient=c:\pcduo\wclientw.exe * /unb", PCD_section_range);
  127.         Else
  128.             ! We should now be positioned on the display.old line
  129.             ! Move down, open up a new line and add a wclient= line
  130.  
  131.             MESSAGE ("Installing the PC-Duo Windows Client.");
  132.  
  133.             POSITION (LINE_BEGIN);
  134.             MOVE_VERTICAL (1);
  135.             COPY_TEXT ("wclient=c:\pcduo\wclientw.exe * /unb");
  136.             SPLIT_LINE;
  137.         Endif;
  138.  
  139.         ! OK. That is [boot] finished. Move on to [386Enh].
  140.         ! Create a range to map the [386Enh] section.
  141.  
  142.         PCD_section_range := LUT_create_range (LINE_BEGIN + "[386Enh]", LINE_BEGIN + "[");
  143.  
  144.         ! Check for PCDVXD.386. This is not at the beginning of a line,
  145.         ! so don't use the pattern.
  146.  
  147.         PCD_display_drv := LUT_win_get_value ("[386Enh]", "PCDVXD.386", PCD_section_range);
  148.  
  149.         If (PCD_display_drv <> 0)
  150.         Then
  151.             MESSAGE ("The PC-Duo Virtual Device Driver is already installed. Updating.");
  152.  
  153.             ! We can't use LUT_win_line_replace_add to replace device= line(s),
  154.             ! as it won't get the right line. However, we are positioned at
  155.             ! "pcdvxd". Move to the beginning of the line, and replace it.
  156.  
  157.             POSITION (LINE_BEGIN);
  158.             COPY_TEXT ("device=c:\pcduo\pcdvxd.386");
  159.             SPLIT_LINE;
  160.             ERASE_LINE;
  161.         Else
  162.             MESSAGE ("Installing the PC-Duo Virtual Device Driver.");
  163.  
  164.             ! Position the cursor at the beginning of the range
  165.             ! (i.e. on the "[")
  166.  
  167.             POSITION (BEGINNING_OF (PCD_section_range));
  168.             MOVE_VERTICAL (1);
  169.             COPY_TEXT ("; PCD Virtual Device Driver");
  170.             SPLIT_LINE;
  171.             COPY_TEXT ("device=c:\pcduo\pcdvxd.386");
  172.             SPLIT_LINE;
  173.         Endif;
  174.  
  175.         ! Next, we check the NetHeapSize. The correct value to use depends
  176.         ! upon whether we are running Windows for Workgroups or just Windows
  177.         ! We can find this out by looking for [network] EnableSharing.
  178.         ! This is only present on WFW (3.1 and 3.11).
  179.  
  180.         PCD_new_netheapsize := 16;
  181.  
  182.         PCD_wfw_enablesharing := LUT_win_get_value ("[network]", (LUT_start_line_opt_whitespace + "EnableSharing"));
  183.  
  184.         ! If the line is found, we can check the actual value. We potentially
  185.         ! need more heap if EnableSharing is "1" (WFW 3.1) or "Yes" (WFW 3.11)
  186.         ! as these will enable the Protected Mode Server (VSERVER.386).
  187.  
  188.         If (PCD_wfw_enablesharing <> 0)
  189.         Then
  190.             MESSAGE (FAO ("WFW sharing detected. EnableSharing=!AS", PCD_wfw_enablesharing));
  191.  
  192.             ! The default is for sharing to be enabled. Check for disabled.
  193.  
  194.             If ((PCD_wfw_enablesharing = "No")
  195.             OR  (PCD_wfw_enablesharing = "0"))
  196.             Then
  197.                 PCD_new_netheapsize := 28;
  198.             Else
  199.                 PCD_new_netheapsize := 40;
  200.             Endif;
  201.         Endif;
  202.  
  203.         ! Read the current NetHeapSize. Use the pattern again to make sure
  204.         ! that we don't get confused by DNETHeapSize
  205.  
  206.         PCD_old_netheapsize := LUT_win_get_value ("[386Enh]", (LUT_start_line_opt_whitespace + "NetHeapSize"), PCD_section_range);
  207.  
  208.         ! Check the current NetHeapSize. If it is not present, empty, or less than
  209.         ! PCD_new_netheapsize, increase the value.
  210.  
  211.         If ((PCD_old_netheapsize = 0)
  212.         OR (PCD_old_netheapsize = "")
  213.         OR (INT (PCD_old_netheapsize) < PCD_new_netheapsize))
  214.         Then
  215.             MESSAGE (FAO ("Increasing NetHeapSize to !UL", PCD_new_netheapsize));
  216.  
  217.             LUT_win_line_replace_add ("[386Enh]", "NetHeapSize=", "NetHeapSize=" + STR (PCD_new_netheapsize));
  218.         Else
  219.             MESSAGE (FAO ("Current NetHeapSize is !AS", PCD_old_netheapsize));
  220.         Endif;
  221.     Else
  222.         MESSAGE ("Invalid SYSTEM.INI file format. Aborting.");
  223.         Quit;
  224.     Endif;
  225. Endprocedure;
  226.  
  227.  
  228. LUT_start_edit ();      ! This reads the file (if it exists), creates a buffer,
  229.                         ! and positions us at the top of the buffer
  230.  
  231. IF LUT_buffer_empty
  232. THEN
  233.     quit;               ! Error - the input file must exist!
  234. ENDIF;
  235.  
  236. ! Do the update
  237.  
  238. PCD_update_system ();
  239.  
  240. ! And now perform 'standard' finishing functions...
  241.  
  242. LUT_finish_edit ();
  243.